from . import admin_blue
from flask import render_template,request,session,redirect,g,jsonify
from info.models import User,News,Category
from info.utils.commons import user_login_data
import time
from datetime import datetime,timedelta
from info import constants,db
from info.response_code import RET,error_map
from info.utils.upload import rest_upload

# 功能: 添加新闻分类
@admin_blue.route('/add_category',methods=["POST"])
def add_category():
    # 获取参数
    c_id = request.json.get("id","")
    c_name = request.json.get("name")

    # 为空校验
    if not all([c_name]):
        return jsonify(errno=RET.NODATA,errmsg=error_map[RET.NODATA])

    # 修改分类数据
    if c_id:
        category = Category.query.get(c_id)
        category.name = c_name
    else:
        # 新增
        new_c = Category()
        new_c.name = c_name
        db.session.add(new_c)

    # 提交数据
    db.session.commit()

    # 返回
    return jsonify(errno=RET.OK,errmsg=error_map[RET.OK])

# 功能: 新闻分类展示
@admin_blue.route('/news_category')
def news_category():

    # 查询分类数据
    categories = Category.query.all()

    # 携带数据渲染页面
    return render_template('admin/news_type.html',categories=categories)

# 功能: 新闻版式编辑详情展示
@admin_blue.route('/news_edit_detail',methods=['GET','POST'])
def news_edit_detail():

    # 获取请求参数,如果是GET请求应该渲染页面
    if request.method == "GET":
        # 查询新闻数据
        news_id = request.args.get("news_id")
        news = News.query.get(news_id)

        # 查询分类数据
        categories = Category.query.all()
        return render_template('admin/news_edit_detail.html',news=news.to_dict(),categories=categories)

    # 如果是POST请求,那么就是编辑的详情内容修改
    # 获取参数
    news_id = request.form.get("news_id")
    title = request.form.get("title")
    digest = request.form.get("digest")
    content = request.form.get("content")
    category_id = request.form.get("category_id")
    index_image = request.files.get("index_image")

    # 为空参数校验
    if not all([news_id,title,digest,content,category_id]):
        return jsonify(errno=RET.NODATA,errmsg=error_map[RET.NODATA])

    # 根据新闻编号,查询新闻对象
    news = News.query.get(news_id)

    # 判断是否上传了图片
    if index_image:
        index_image.name = f"{time.time()}{news.user.mobile}{index_image.name}"
        response = rest_upload(index_image)
        if not response:
            return jsonify(errno=RET.THIRDERR, errmsg=error_map[RET.NODATA])

        # 更新新闻图片
        news.index_image_url = constants.UPYUN_PREFIX + index_image.name

    # 更新新闻数据
    news.title = title
    news.digest = digest
    news.content = content
    news.category_id = category_id

    # 提交数据
    db.session.commit()

    # 返回响应
    return jsonify(errno=RET.OK,errmsg=error_map[RET.OK])

# 功能: 新闻版式编辑展示
@admin_blue.route('/news_edit')
def news_edit():

    # 获取请求参数
    page = int(request.args.get("p",1))
    keyWords = request.args.get("keyWords", "")

    # 查询所有的新闻,分页展示
    paginate = News.query.filter(News.status==0,News.title.contains(keyWords)).order_by(News.create_time.desc()).paginate(page,10,False)

    # 获取分页对象数据
    totalPage = paginate.pages
    currentPage = paginate.page
    items = paginate.items

    # 携带数据渲染页面
    data = {
        "totalPage": totalPage,
        "currentPage": currentPage,
        "news_list": [n.to_review_dict() for n in items]
    }
    return render_template('admin/news_edit.html',data=data)

# 功能: 新闻内容审核
@admin_blue.route('/news_review_detail',methods=["GET","POST"])
def news_review_detail():

    # 1, 如果是get请求,表示展示审核页面的数据
    if request.method == "GET":
        # 获取新闻编号
        news_id = request.args.get("news_id")

        # 获取新闻对象
        news = News.query.get(news_id)

        # 携带新闻数据,渲染页面
        return render_template('admin/news_review_detail.html',news=news.to_dict())

    # 2, 如果是POST请求,那么证明提交了审核过程
    action = request.json.get("action")
    news_id = request.json.get("news_id")
    reason = request.json.get("reason")

    # 3, 为空校验
    if not all([action,news_id,reason]):
        return jsonify(errno=RET.NODATA,errmsg=error_map[RET.NODATA])

    # 4,校验action的状态
    if action not in ["accept","reject"]:
        return jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])

    # 5,查询新闻状态,并更新新闻状态
    news = News.query.get(news_id)
    news.status = (0 if action == "accept" else -1)
    news.reason = (reason if action == "reject" else "")

    # 6,提交数据
    db.session.commit()

    # 7,返回响应
    return jsonify(errno=RET.OK,errmsg=error_map[RET.OK])

# 功能: 新闻审核列表
@admin_blue.route('/news_review')
def news_review():

    # 获取查询参数
    page = int(request.args.get("p",1))
    keyWords = request.args.get("keyWords","")

    # 分页查询新闻(审核中,审核未通过的)
    paginate = News.query.filter(News.status!=0,News.title.contains(keyWords)).order_by(News.create_time.desc()).paginate(page,constants.ADMIN_REVIEW_NEWS_COUNT,False)

    # 获取分页对象的数据
    totalPage = paginate.pages
    currentPage = paginate.page
    items = paginate.items

    # 拼接数据,渲染页面
    data = {
        "totalPage": totalPage,
        "currentPage": currentPage,
        "news_list": [n.to_review_dict() for n in items]
    }

    return render_template('admin/news_review.html',data=data)

# 功能: 用户列表
@admin_blue.route('/user_list')
def user_list():

    # 获取参数
    page = int(request.args.get("p",1))

    # 分页查询用户数据
    paginate = User.query.filter(User.is_admin==False).order_by(User.create_time.desc()).paginate(page,constants.ADMIN_USER_LIST_COUNT,False)

    # 获取分页对象数据
    totalPage = paginate.pages
    currentPage = paginate.page
    items = paginate.items

    # 拼接数据,渲染页面
    data = {
        "totalPage":totalPage,
        "currentPage":currentPage,
        "user_list":[u.to_admin_dict() for u in items]
    }
    return render_template('admin/user_list.html',data=data)

# 功能: 用户统计
@admin_blue.route('/user_count')
def user_count():
    # 1,查询用户总数(不包括管理员)
    total_count = User.query.filter(User.is_admin == False).count()

    # 2,获取当月新增人数,strptime(dateStr,timeFormat) dateStr: 时间的字符串; timeFormat: 格式化的符号
    # strptime方法作用: 将一个日期字符串转换成一个datetime的日期对象
    lt = time.localtime()
    month_start_str = f"{lt.tm_year}-{lt.tm_mon}-01" # 当月的1号字符串
    month_start_date = datetime.strptime(month_start_str,"%Y-%m-%d") # 当月的1号日期
    month_count = User.query.filter(User.create_time >= month_start_date,User.is_admin==False).count()

    # 3,获取当天新增人数
    day_start_str = f"{lt.tm_year}-{lt.tm_mon}-{lt.tm_mday}"  # 当日的0点字符串
    day_start_date = datetime.strptime(day_start_str, "%Y-%m-%d") # 当日的0点日期
    day_count = User.query.filter(User.create_time >= day_start_date, User.is_admin == False).count()

    # 4,统计过去一个月的用户活跃量
    activate_count = []
    activate_date = []
    for i in range(0,5): # [0,29]
        # 假设某一天的开始A
        begin_date = day_start_date - timedelta(days=i) # 4月12

        # 假设某一天的结束B
        end_date = day_start_date - timedelta(days=i-1) # 4月13
        print(begin_date,end_date)

        # 当前的活跃量
        current_day_activate_count = User.query.filter(User.last_login>=begin_date,
                                                       User.last_login<end_date,
                                                       User.is_admin == False
                                                       ).count()

        # 添加活跃人数
        activate_count.append(current_day_activate_count)
        activate_date.append(begin_date.strftime("%Y-%m-%d"))

    # 反转活跃人数,活跃日期
    activate_count.reverse()
    activate_date.reverse()


    # 携带数据渲染页面
    data = {
        "total_count":total_count,
        "month_count":month_count,
        "day_count":day_count,
        "activate_count":activate_count,
        "activate_date":activate_date
    }
    return render_template('admin/user_count.html',data=data)

# 功能: 管理员首页
@admin_blue.route('/index')
@user_login_data
def admin_index():
    # 1,判断用户是否登录,并且是管理员
    if not (g.user and g.user.is_admin):
        return redirect('/')

    # 2,如果登录是管理员返回首页,并携带数据
    data = {
        "user_info":g.user.to_dict()
    }
    return render_template("admin/index.html",data=data)

# 功能: 管理员登录
@admin_blue.route('/login',methods=["GET","POST"])
def admin_login():
    # 1,如果是GET请求,返回登录页面
    if request.method == "GET":
        if session.get("is_admin"):
            return redirect("/admin/index")
        return render_template("admin/login.html")

    # 2,如果POST请求,获取参数
    username = request.form.get("username")
    password = request.form.get("password")

    # 3,参数为空校验
    if not all([username,password]):
        return render_template("admin/login.html",errmsg="账号或者密码不能为空")

    # 4,通过用户名(手机号),查询用户对象
    admin_user = User.query.filter(User.mobile==username,User.is_admin==True).first()
    if not admin_user:
        return render_template('admin/login.html',errmsg="该用户不存在")

    # 5,校验管理员的密码
    if not admin_user.check_password(password):
        return render_template('admin/login.html', errmsg="用户或密码错误")

    # 6,记录管理员登录状态
    session["user_id"] = admin_user.id
    session["is_admin"] = True

    # 7,重定向到管理员首页
    return redirect("/admin/index")